
#include "board_gpio.h"



/**
  * @brief  Init all neccessary GPIO pins.
  * @param  None.
  * @retval None
  */
void gpio_init(void)
{
  /*PB1 connected to Blue LED. */
  board_gpio_init( GPIOB, GPIO_Pin_1, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);

  /*PA11 . */
  board_gpio_init( GPIOA, GPIO_Pin_11, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);
  /*PB0 . */
  board_gpio_init( GPIOB, GPIO_Pin_0, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);

  /* Motor control CW and CCW pins*/
  /*PA0 . */
  board_gpio_init( GPIOA, GPIO_Pin_0, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);
  /*PA1 . */
  board_gpio_init( GPIOA, GPIO_Pin_1, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);
  /*PA2 . */
  board_gpio_init( GPIOA, GPIO_Pin_2, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);
  /*PA3 . */
  board_gpio_init( GPIOA, GPIO_Pin_3, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);



  /*PA6 . */
  board_gpio_init( GPIOA, GPIO_Pin_6, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);
    /*PA7 . */
  board_gpio_init( GPIOA, GPIO_Pin_7, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);

  /* Connect PA8 MCO pin  to  PLL/2 output. */
  //board_gpio_init( GPIOA, GPIO_Pin_8, GPIO_Speed_50MHz,GPIO_Mode_AF_PP);
  // IT SHOULD NOT BE HERE. JUST FOR TEST
  /* Connect PA8 MCO pin  to  PLL/2 output. */
  //RCC_MCOConfig(RCC_MCO_PLLCLK_Div2);
}




/**
  * @brief  Init GPIO pin of port.
  * @param  board_port: Specifies the board port to be configured.
  *   This parameter can be one of following parameters:
  *     @arg GPIOA
  *     @arg GPIOB
  *     @arg GPIOC
  * @param  port_pin: number of port pin for initialisation.
  * @retval None
  */
void board_gpio_init(
                      GPIO_TypeDef* board_port,
                      uint16_t port_pin,
                      GPIOSpeed_TypeDef pin_speed,
                      GPIOMode_TypeDef pin_mode
                    )
{
  /* Create structure for initialisation. */
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Enable PORT Periph clock. */
  if(board_port == GPIOA)
  {
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE);
  }
  else if(board_port == GPIOB)
  {
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE);
  }
  else if(board_port == GPIOC)
  {
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE);
  }
  else
  {
    assert_param(0);
  }
  /* Configurate the GPIO pin. */
  GPIO_InitStructure.GPIO_Pin   = port_pin;
  GPIO_InitStructure.GPIO_Speed = pin_speed;
  GPIO_InitStructure.GPIO_Mode  = pin_mode;
  /* Init GPIO pin. */
  GPIO_Init( board_port, &GPIO_InitStructure);
}


void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  uint16_t state;
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_PIN(GPIO_Pin));

  state = GPIOx->IDR  & GPIO_Pin;
  if(state == 0)
  {
    GPIOx->BSRR = GPIO_Pin;
  }
  else
  {
    GPIOx->BRR = GPIO_Pin;
  }
}









